From 912c8fb76389563d8a73b58e031a079bffe64141 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Mon, 29 Aug 2005 11:23:10 +0000 Subject: [PATCH] added dir traversal for dynamic extensions --- ChangeLog | 8 +++ babl/babl-conversion.h | 2 +- babl/babl-db.h | 6 +- babl/babl-extension.c | 134 ++++++++++++++++++++++++++++++++++++++--- babl/babl-extension.h | 3 + babl/babl-instance.h | 2 +- babl/babl-introspect.c | 7 +-- 7 files changed, 146 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index cbc40c4..8296a55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-08-29 Øyvind Kolås + + * babl/babl-db.h: Do nor warn about collision during db_insert + * babl/babl-extension.[ch]: Implemented fs traversal based on BABL_PATH. + added babl_set_extender to API. + * babl/babl-instance.h: Changed signature of type_name##_new. + * babl/babl-introspect.c: (babl_introspect): use new babl_extender + 2005-08-29 Øyvind Kolås * babl/babl-internal.c: (babl_internal_init): set memory functions. diff --git a/babl/babl-conversion.h b/babl/babl-conversion.h index 50f06c6..e33a44b 100644 --- a/babl/babl-conversion.h +++ b/babl/babl-conversion.h @@ -26,7 +26,7 @@ void babl_conversion_process (BablConversion *conversion, void *source, void *destination, - long n); + long n); Babl * babl_conversion_new (Babl *source, Babl *destination, diff --git a/babl/babl-db.h b/babl/babl-db.h index 1b1c937..14c0d34 100644 --- a/babl/babl-db.h +++ b/babl/babl-db.h @@ -117,14 +117,16 @@ db_insert (Babl *babl) if (collision) { +#if 0 if (!strcmp (collision->instance.name, babl->instance.name) ) babl_log ("conflicting name:\n\t\tnew: '%s'\n\t\texisting '%s' from %s", babl->instance.name, collision->instance.name, - BABL(collision->instance.creator)->instance.name); + collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core"); else if (collision->instance.id == babl->instance.id) babl_log ("conflicting id:\n\t\tnew: '%s' (id=%i)\n\t\texisting '%s' from %s", babl->instance.name, babl->instance.id, collision->instance.name, - BABL(collision->instance.creator)->instance.name); + collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core"); +#endif return collision; } diff --git a/babl/babl-extension.c b/babl/babl-extension.c index 667817f..6c9573a 100644 --- a/babl/babl-extension.c +++ b/babl/babl-extension.c @@ -17,6 +17,11 @@ * Boston, MA 02111-1307, USA. */ +#define BABL_PATH "/usr/lib/babl:/usr/local/lib/babl:~/.babl"; +#define BABL_PATH_SEPERATOR "/" +#define BABL_LIST_SEPERATOR ':' + + #define BABL_DYNAMIC_EXTENSIONS #define BABL_INIT_HOOK init_hook(); @@ -37,7 +42,7 @@ static int each_babl_extension_destroy (Babl *babl, void *data); -Babl *babl_extension_current_extender = NULL; +static Babl *babl_extension_current_extender = NULL; Babl * babl_extender (void) @@ -47,7 +52,7 @@ babl_extender (void) return NULL; } -static void +void babl_set_extender (Babl *new_extender) { babl_extension_current_extender = new_extender; @@ -135,7 +140,6 @@ destroy_hook (void) #define RTLD_NOW 0 #endif - static Babl * load_failed (Babl *babl) { @@ -157,7 +161,6 @@ babl_extension_load (const char *path) int (*init) (void) = NULL; void (*destroy) (void) = NULL; - dl_handle = dlopen (path, RTLD_NOW); if (!dl_handle) { @@ -183,7 +186,6 @@ babl_extension_load (const char *path) return load_failed (babl); } - if (db_insert (babl) == babl) { babl_set_extender (NULL); @@ -195,11 +197,128 @@ babl_extension_load (const char *path) } } +static void +babl_extension_load_dir (const char *base_path) +{ + DIR *dir; + + if ((dir = opendir (base_path))) + { + struct dirent *dentry; + + while ((dentry = readdir (dir)) != NULL) + { + if (dentry->d_name[0] != '.' && + dentry->d_ino > 0) + { + char *path = NULL; + struct stat st; + char *extension; + + path = babl_strcat (path, base_path); + path = babl_strcat (path, BABL_PATH_SEPERATOR); + path = babl_strcat (path, dentry->d_name); + + stat (path, &st); + + if ((extension = strrchr (dentry->d_name, '.')) !=NULL && + !strcmp (extension, ".so")) + { + babl_extension_load (path); + } + + babl_free (path); + } + + } + } +} + +static const char * +babl_dir_list (void) +{ + const char *ret; + + ret = getenv ("BABL_PATH"); + if (!ret) + ret = BABL_PATH; + return ret; +} + + +static char * +expand_path (char *path) +{ + char *src; + char *dst; + + dst = NULL; + + src=path; + + while(*src) + { + switch (*src) + { + case '~': + dst = babl_strcat (dst, getenv ("HOME")); + break; + default: + { + char tmp[2]="?"; + tmp[0]=*src; + dst = babl_strcat (dst, tmp); + } + } + src++; + } + return dst; +} + + +/* parse the provided colon seperated list of paths to search + */ +static void +babl_extension_load_dir_list (const char *dir_list) +{ + int eos = 0; + const char *src; + char *path, *dst; + + + path = babl_strdup (dir_list); + src = dir_list; + dst = path; + + while (!eos) + { + switch (*src) + { + case '\0': + eos=1; + case BABL_LIST_SEPERATOR: + { + char *expanded_path = expand_path (path); + babl_extension_load_dir (expanded_path); + babl_free (expanded_path); + } + dst=path; + src++; + *dst = '\0'; + break; + default: + *(dst++) = *(src++); + *dst = '\0'; + break; + } + } + babl_free (path); +} + static void dynamic_init_hook (void) { - babl_extension_load ("/home/pippin/.babl/naive-CMYK.so"); - babl_extension_load ("/home/pippin/.babl/CIE-Lab.so"); + babl_extension_load_dir_list (babl_dir_list ()); } #endif @@ -219,5 +338,4 @@ each_babl_extension_destroy (Babl *babl, return 0; /* continue iterating */ } - BABL_CLASS_TEMPLATE (babl_extension) diff --git a/babl/babl-extension.h b/babl/babl-extension.h index b344ea2..3de0c58 100644 --- a/babl/babl-extension.h +++ b/babl/babl-extension.h @@ -24,7 +24,10 @@ #include "babl-instance.h" Babl * babl_extension_base (void); + Babl * babl_extender (void); +void babl_set_extender (Babl *new_extender); + Babl * babl_extension_quiet_log (void); BABL_DEFINE_CLASS (babl_extension) diff --git a/babl/babl-instance.h b/babl/babl-instance.h index 809b226..c5bf2ad 100644 --- a/babl/babl-instance.h +++ b/babl/babl-instance.h @@ -18,7 +18,7 @@ void type_name##_each (BablEachFunction each_fun, \ void *user_data); \ Babl * type_name (const char *name); \ Babl * type_name##_id (int id); \ -Babl * type_name##_new (const char *name, \ +Babl * type_name##_new (void *first_arg, \ ...); diff --git a/babl/babl-introspect.c b/babl/babl-introspect.c index fb3ed80..09995a8 100644 --- a/babl/babl-introspect.c +++ b/babl/babl-introspect.c @@ -33,14 +33,13 @@ static int each_introspect (Babl *babl, void *user_data); #endif -extern Babl *babl_extension_current_extender; void babl_introspect (Babl *babl) { #ifdef BABL_LOG - Babl *extender_backup = babl_extension_current_extender; + Babl *extender_backup = babl_extender (); - babl_extension_current_extender = babl_extension_quiet_log(); + babl_set_extender (babl_extension_quiet_log()); if (babl) { @@ -76,7 +75,7 @@ babl_introspect (Babl *babl) babl_fish_each (each_introspect, NULL); babl_log (""); - babl_extension_current_extender = extender_backup; + babl_set_extender (extender_backup); #endif } -- 2.30.2